/**
 * 框架API封装
 */
let os = tt;

/**
 * 判断小程序的API，回调，参数，组件等是否在当前版本可用
 */
const canIUse = function(schema) {
  return os.canIUse(schema);
}

/**
 * 发起 HTTPS 网络请求
 */
const request = function(options) {
  return os.request(options);
}

/**
 * 获取用户临时的登录凭证
 */
const login = function(options) {
  os.login(options);
}

/**
 * 获取用户的基本信息
 */
const getUserProfile = function(options) {
  options.force = true;
  os.getUserProfile(options);
}

/**
 * 检查登录态
 */
const checkSession = function(options) {
  os.checkSession(options);
}

/**
 * 显示消息提示框
 */
const showToast = function(options) {
  os.showToast(options);
}

/**
 * 显示 loading 提示框
 */
const showLoading = function(options = {}) {
  os.showLoading(options);
}

/**
 * 隐藏 loading 提示框
 */
const hideLoading = function(options = {}) {
  os.hideLoading(options);
}

/**
 * 保留当前页面，跳转到应用内的某个页面，但是不能跳转到 tabBar 页面
 */
const navigateTo = function(options) {
  os.navigateTo(options);
}

/**
 * 关闭当前页面，返回上一页面或多级页面
 */
const navigateBack = function(options) {
  os.navigateBack(options);
}

/**
 * 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面
 */
const switchTab = function(options) {
  os.switchTab(options);
}

/**
 * 关闭所有页面，打开应用内的某个页面
 */
const reLaunch = function(options) {
  os.reLaunch(options);
}

/**
 * 关闭当前页面，跳转到应用内的某个页面，不能跳转到 tabBar 页面
 */
const redirectTo = function(options) {
  os.redirectTo(options);
}

/**
 * 获取本地缓存中指定key的内容(同步)
 */
const getStorageSync = function(key) {
  return os.getStorageSync(key);
}

/**
 * 以「键值对」的形式设置本地缓存数据(同步)
 */
const setStorageSync = function(key, rawData) {
  os.setStorageSync(key, rawData);
}

/**
 * 从本地缓存数据中删除 key 对应的值(同步)
 */
const removeStorageSync = function(key) {
  os.removeStorageSync(key);
}

/**
 * 清理本地数据缓存(同步)
 */
const clearStorageSync = function() {
  os.clearStorageSync();
}

/**
 * 获取本地缓存中指定key的内容(异步)
 */
const getStorage = function(options) {
  return os.getStorage(options);
}

/**
 * 以「键值对」的形式设置本地缓存数据(异步)
 */
const setStorage = function(options) {
  os.setStorage(options);
}

/**
 * 从本地缓存数据中删除 key 对应的值(异步)
 */
const removeStorage = function(options) {
  os.removeStorage(options);
}

/**
 * 清理本地数据缓存(异步)
 */
const clearStorage = function(options = {}) {
  os.clearStorage(options);
}

/**
 * 获取系统信息(同步)
 */
const getSystemInfoSync = function() {
  return os.getSystemInfoSync();
}

/**
 * 获取设备信息
 */
const getDeviceInfo = function() {
  if (canIUse('getDeviceInfoSync') === false) {
    return null;
  }
  return os?.getDeviceInfoSync() || null;
}

/**
 * 获取设备信息
 */
const getLaunchOptionsSync = function() {
  return os.getLaunchOptionsSync();
}

/**
 * 获取窗口信息
 */
const getWindowInfo = function() {
  return os.getSystemInfoSync();
}

/**
 * 菜单按钮的布局位置信息
 */
const getMenuButtonBoundingClientRect = function() {
  return os.getMenuButtonBoundingClientRect();
}

/**
 * DOM布局位置查询
 */
const getBoundingClientRect = function(selector) {
  return new Promise((resolve) => {
    const query = os.createSelectorQuery();
    query.select(selector).boundingClientRect(function(res){
      resolve(res);
    }).exec();
  });
}

/**
 * 返回一个 SelectorQuery 的实例
 */
const createSelectorQuery = function() {
  return os.createSelectorQuery();
}

/**
 * 预下单
 */
const requestOrder = function(options) {
  os.requestOrder(options);
}

/**
 * 拉起用户支付收银台​
 */
const getOrderPayment = function(options) {
  os.getOrderPayment(options);
}

/**
 * 隐藏 tabBar
 */
const hideTabBar = function(options = {}) {
  os.hideTabBar(options);
}

/**
 * 显示 tabBar
 */
const showTabBar = function(options = {}) {
  os.showTabBar(options);
}

/**
 * 隐藏转发按钮
 */
const hideShareMenu = function(options = {}) {
  os.hideShareMenu(options);
}

/**
 * 显示导航条加载动画
 */
const showNavigationBarLoading = function(options = {}) {
  os.showNavigationBarLoading(options);
}

/**
 * 隐藏导航条加载动画
 */
const hideNavigationBarLoading = function(options = {}) {
  os.hideNavigationBarLoading(options);
}

/**
 * 设置导航栏标题
 */
const setNavigationBarTitle = function(options) {
  os.setNavigationBarTitle(options);
}

/**
 * 显示模态弹窗
 */
const showModal = function(options) {
  os.showModal(options);
}

/**
 * 视频预加载
 */
const preloadResourceVideo = function(options) {
  return os.preloadResourceVideo(options);
}

/**
 * 创建视频预加载任务
 */
const preloadVideo = function(options) {
  return os.preloadVideo(options);
}

/**
 * 创建控制组件的上下文 VideoContext 对象
 */
const createVideoContext = function(id, component = {}) {
  return os.createVideoContext(id, component);
}

/**
 * 禁止用户录屏
 */
const disableUserScreenRecord = function(options = {}) {
  os.disableUserScreenRecord(options);
}

/**
 * 取消禁止用户录屏
 */
const enableUserScreenRecord = function(options = {}) {
  os.enableUserScreenRecord(options);
}

/**
 * 监听用户主动录屏事件
 */
const onUserScreenRecord = function(callback) {
  os.onUserScreenRecord(callback);
}

/**
 * 取消监听用户主动录屏事件
 */
const offUserScreenRecord = function(callback = () => {} ) {
  os.offUserScreenRecord(callback);
}

/**
 * 创建激励视频广告组件
 */
const createRewardedVideoAd = function(params) {
  return os.createRewardedVideoAd(params);
}

/**
 * 创建插屏广告组件
 */
const createInterstitialAd = function(params) {
  return os.createInterstitialAd(params);
}

/**
 * 获取小程序环境信息
 */
const getEnvInfoSync = function(params) {
  if (canIUse('getEnvInfoSync') === false) {
    return null;
  }
  return os?.getEnvInfoSync(params) || null;
}

module.exports = {
  canIUse,
  request,
  login,
  getUserProfile,
  checkSession,
  showToast,
  showLoading,
  hideLoading,
  navigateTo,
  navigateBack,
  switchTab,
  reLaunch,
  redirectTo,
  getStorageSync,
  setStorageSync,
  removeStorageSync,
  clearStorageSync,
  getStorage,
  setStorage,
  removeStorage,
  clearStorage,
  getSystemInfoSync,
  getDeviceInfo,
  getLaunchOptionsSync,
  getWindowInfo,
  getMenuButtonBoundingClientRect,
  getBoundingClientRect,
  createSelectorQuery,
  requestOrder,
  getOrderPayment,
  hideTabBar,
  showTabBar,
  hideShareMenu,
  showNavigationBarLoading,
  hideNavigationBarLoading,
  setNavigationBarTitle,
  showModal,
  preloadResourceVideo,
  createVideoContext,
  disableUserScreenRecord,
  enableUserScreenRecord,
  onUserScreenRecord,
  offUserScreenRecord,
  createRewardedVideoAd,
  createInterstitialAd,
  getEnvInfoSync
}
